Fingerprinting이란?
SQL Injection에서 fingerprinting은 오류 메시지, 시스템 테이블, 함수 차이, 버전 문자열 등을 이용해 DBMS 종류와 버전, 스키마 정보를 식별하는 과정이다.
모의 해킹에서는 PTES(Penetration Testing Execution Standard)의 정찰 및 취약점 분석 단계와 연결해서 볼 수 있다.
1. MySQL
시스템 테이블
information_schema,mysql,performance_schema,sys데이터베이스가 존재한다.
mysql> SELECT TABLE_SCHEMA FROM information_schema.TABLES GROUP BY TABLE_SCHEMA;
/*
+--------------------+
| TABLE_SCHEMA |
+--------------------+
| information_schema |
| DREAMHACK |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
*/테이블 정보
TABLES테이블을 통해서 스키마의 정보를 조회할 수 있다.TABLE_SCHEMA와TABLE_NAME에 해당하는 정보를 모두 출력한다.
mysql> SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLES;
/*
+--------------------+----------------+
| TABLE_SCHEMA | TABLE_NAME |
+--------------------+----------------+
| information_schema | CHARACTER_SETS |
...
| DREAMHACK | users |
| mysql | db |
...
+--------------------+----------------+
292 rows in set (0.01 sec)
*/컬럼 정보
COLUMNS테이블을 통해 컬럼의 정보를 조회할 수 있음.TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME의 데이터를 모두 조회한다.
mysql> SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME FROM information_schema.COLUMNS;
/*
+--------------------+----------------+--------------------+
| TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME |
+--------------------+----------------+--------------------+
| information_schema | CHARACTER_SETS | CHARACTER_SET_NAME |
...
| DREAMHACK | users | uid |
| DREAMHACK | users | upw |
...
| mysql | db | Db |
| mysql | db | User |
...
+--------------------+----------------+--------------------+
3132 rows in set (0.07 sec)
*/실시간 실행 쿼리 정보
PROCESSLIST테이블을 통해서 실시간으로 실행되는 쿼리를 조회할 수 있다.
mysql> SELECT * FROM information_schema.PROCESSLIST;
/*
+-------------------------------------------------+
| info |
+-------------------------------------------------+
| select info from information_schema.PROCESSLIST |
+-------------------------------------------------+
1 row in set (0.00 sec)
*/sys데이터베이스의SESSION테이블을 통해서 실행 중인 계정과 함께 조회하는 방법도 있음.
mysql> SELECT user, current_statement FROM sys.session;
/*
+----------------+------------------------------------------------+
| user | current_statement |
+----------------+------------------------------------------------+
| root@localhost | select user,current_statement from sys.session |
+----------------+------------------------------------------------+
1 row in set (0.05 sec)
*/DBMS 계정 정보
USER_PRIVILEGES테이블은 MySQL 서버의 계정 정보를 조회할 수 있다.USER_PRIVILEGES테이블의GRANTEE, PRIVILEGE_TYPE,IS_GRANTABLE을 조회할 수 있다.
mysql> SELECT GRANTEE, PRIVILEGE_TYPE, IS_GRANTABLE FROM information_schema.USER_PRIVILEGES;mysql> SELECT User, authentication_string FROM mysql.user;2. MSSQL
시스템 테이블
MSSQL의 경우 초기 설치 시 master , tempd, model, msdb 데이터베이스가 존재한다.
SELECT name FROM sys.databases
/*
name
-------
master
tempdb
model
msdb
dreamhack # 이용자 정의 데이터베이스 (예시)
*/데이터베이스 정보
SYSDATABASES 테이블을 통해 데이터베이스의 정보를 조회 가능
SELECT name FROM master..sysdatabases;
/*
name
-------
master
tempdb
model
msdb
dreamhack # 이용자 정의 데이터베이스 (예시)
*/SELECT DB_NAME(1);
/*
master
*/
USE dreamhack;
/*
Changed database context to 'dreamhack'.
*/
SELECT DB_NAME(0);
/*
dreamhack
*/테이블 정보
SYSOBJECTS 를 통해서 특정 테이베이스의 테이블 정보를 조회할 수 있다.
xtype='U' 는 이용자 정의 테이블을 의미
SELECT name FROM dreamhack..sysobjects WHERE xtype = 'U';
# xtype='U' 는 이용자 정의 테이블을 의미합니다.
/*
name
-------
users
*/INFORMATION_SCHEMA 스키마의 TABLES 테이블의 table_name 이름 방법도 있다.
SELECT table_name FROM dreamhack.information_schema.tables;
/*
table_name
-----------
users
*/
컬럼 정보
SYSCLOUMNS 테이블을 이용하여 컬럼 정보를 조회할 수 있음.
SELECT name FROM syscolumns WHERE id = (SELECT id FROM sysobjects WHERE name = 'users');
/*
name
-----
uid
upw
*/INFORMATION_SCHEMA 의 COLUMNS 테이블을 참조해 조회할 수 있다.
SELECT table_name, column_name FROM dreamhack.information_schema.columns;
/*
table_name column_name
-------------------------
users uid
users upw
*/